package Modelo;

import Controlador.Controlador;
import Vista.Inicio;
import Utils.Ficheros.FicheroDatos;
import com.chaeron.GPS.GPS;
import com.chaeron.GPS.GPSListener;
import com.chaeron.GPS.event.GPSEvent;
import com.chaeron.GPS.event.GPSPosition;
import com.chaeron.GPS.exception.GPSException;

/**
 *
 * GPSJava
 * <BR><BR>
 * Implementa un GPSListener para conectar y recibir datos del dispositivo GPS
 *
 * @author  Administrador
 */
public class GeomantesDatos implements GPSListener {

    private GPS gps;
    private int primeraLocalizacion;
    private Controlador controlador;
    private static FicheroDatos coordenadaActual;
    private FicheroDatos coordenadaAntigua;
    //Variable booleana que nos indica si el gps está conectado o no
    private boolean conectado;

    /**
     * Constructor de la clase GPSJava
     *
     */
    public GeomantesDatos() {
        controlador = Inicio.getControlador();
        primeraLocalizacion = 1;
        coordenadaActual = new FicheroDatos(-1,-1);
        coordenadaAntigua = new FicheroDatos(-1,-1);
        conectado = false;
    }

    /**
     * onGPSEvent(). Callback utilizado para estar a la espera de los eventos producidos por el GPS
     * @param event
     * GPSEvent recibido por el GPS
     * @return boolean
     *
     */
    public boolean onGPSEvent(GPSEvent event) {
        conectado = true;
        boolean handled = false;
        Object eventValue = event.getValue();
        if (event.getType() == GPSEvent.GPS_EVENT_POSITION) {
            GPSPosition pos = (GPSPosition) eventValue;
            //Si es la primera vez que recibimos una posición válida
            switch (primeraLocalizacion) {
                case 0: {
                    if (eventValue != null) {
                        controlador.setLocation(pos);
                        coordenadaActual = new FicheroDatos(pos.getLatitude(),pos.getLongitude());
                        coordenadaAntigua.clone(coordenadaActual);
                    }
                    break;
                }
                case 1: {
                    if (pos != null) {
                        primeraLocalizacion = 0;
                        coordenadaAntigua = new FicheroDatos(pos.getLatitude(),pos.getLongitude());
                    }
                    break;
                }
                default: {
                    break;
                }
            }
        }
        return (handled);
    }

    /**
     * initGPS(). Método necesario para empezar a recibir información del dispositivo GPS
     * @return GPS
     * devuelve un objeto de la clase GPS
     *
     */
    public GPS initGPS() throws GPSException {
        int events = 0;
            gps = GPS.newInstance(GPS.PROTOCOL_NMEA);
            gps.setSerialPort(controlador.getPuertoSerie());	//serial port parameters
            gps.setSerialCheckRead(false);
            gps.setSerialBaudRate(9600);
            gps.setBlockUnfilledPackets(false);
            events = GPSEvent.GPS_EVENT_POSITION;
            gps.addGPSListener(this, events);
            gps.connect();
        return gps;
    }

    /**
     * pollGPS(). Método para preguntar al dispositivo GPS por los datos obtenidos
     *
     */
    public void pollGPS() {
        try {
            gps.poll();
        } catch (GPSException exception) {
            exception.printStackTrace();
        }

    }

    /**
     * disconnectGPS(). Método para desconectar el dispositivo GPS de forma correcta
     *
     */
    public void disconnectGPS() {
        if (gps != null) {
            try {
                gps.disconnect();
                conectado = false;
            } catch (GPSException ex) {
                ex.printStackTrace();
            }
        }
    }

    public FicheroDatos getCoordenada() {
        return coordenadaAntigua;
    }

    public boolean getConectado() {
        return conectado;
    }
}
